# coding=utf-8

import sys  
reload(sys)  
sys.setdefaultencoding('utf8')
from socket import *
import threading, time
import json
import os


class RecvFile(threading.Thread):
    def __init__(self, client, cover=False):
        super(RecvFile, self).__init__()
        self.client = client
        print "准备好接收文件"

        self.cover = cover
        
    def jude_exist(self):
        """先判断是否不存在，不存在直接运行，存在的话得找个完全不同的名字"""
        if os.path.exists(self.path+self.name):
            self.name += "_"
            index = 1
            while True:
                if os.path.exists(self.path+self.name+str(index)):
                    index += 1
                else:
                    self.name += str(index)
                    return
        else:
            return

    
    def build_file(self):
        """创建文件夹和文件"""
        

        data = self.client.recv(1024).decode('utf-8')

        data = json.loads(data)
        
        self.path = data['path']

        self.name = data['name']

        self.len = data['len']

        if data.has_key('cover'):
            self.cover = data['cover']

        try:
            os.system("mkdir -p %s"%self.path)
        except Exception as e:
            print "创建文件夹失败: error   ", e
        else:
            print "创建文件夹成功:  %s"%self.path
        
        if self.cover:
            with open(self.path+self.name, 'wb') as f:
                pass
        else:
            self.jude_exist()


        self.file = open(self.path+self.name, 'ab') 
        
        self.client.send("get ready".encode('utf-8'))

    def write_file(self):
        """循环追加写入文件"""
        
        recv_count = 0
        while True:
            data = self.client.recv(1024)

            if not data:  # 客户端断开连接,基本不会走到这一步
                print "文件接收完成正在保存"
                self.file.close()
                self.client.close()
                return
            
            self.file.write(data)
            recv_count += len(data)
            print "正在接收文件：%s%s, 文件总大小:%0.2fKB, 进度为%0.2f%%"%(self.path, self.name, round(float(self.len)/1024.0, 2), round(float(recv_count)/float(self.len)*100, 2))
            if recv_count >= self.len:
                print "%s接收完成正在保存"%self.name
                self.file.close()
                self.client.close()
                print "%s文件接收完成"%self.name
                return
                


            

    def run(self):
        """最先启动的程序"""

        self.build_file()

        self.write_file()
        
        print "发送流程已完成等待"
        return



def main():
    
    print "启动文件接受服务"

    # 创建socket
    tcp_server_socket = socket(AF_INET, SOCK_STREAM)

    # 本地信息
    address = ('127.0.0.1', 13588)

    # 绑定
    tcp_server_socket.bind(address)

    # 使用socket创建的套接字默认的属性是主动的，使用listen将其变为被动的，这样就可以接收别人的链接了
    tcp_server_socket.listen(128)
    while True:
        # 如果有新的客户端来链接服务器，那么就产生一个新的套接字专门为这个客户端服务
        # client_socket用来为这个客户端服务
        # tcp_server_socket就可以省下来专门等待其他新客户端的链接
        client_socket, clientAddr = tcp_server_socket.accept()
        new_client = RecvFile(client_socket)
        new_client.start()


        """
        # 接收对方发送过来的数据
        recv_data = client_socket.recv(1024)  # 接收1024个字节
        print('接收到的数据为:', recv_data.decode('gbk'))

        # 发送一些数据到客户端
        client_socket.send("thank you !".encode('gbk'))

        # 关闭为这个客户端服务的套接字，只要关闭了，就意味着为不能再为这个客户端服务了，如果还需要服务，只能再次重新连接
        client_socket.close()
        """

if __name__ == "__main__":
    main()
